#ifndef __ES_STEP_MOTOR_H__
#define __ES_STEP_MOTOR_H__

#include "stm_std_lib.h"
#include "es_gpio.h"
#include "esapi.h"


/*
两相步进电机驱动程序


步进电机转动公式:
	转动角度=脉冲数*(步距角/细分)
	
	例：步距角1.8度，转动90度,需要50脉冲(细分=1)
	90=50*1.8/1	(当细分=1时)
*/
class es_StepMotor {
public:

	//步进电机初始化(需要同一个GPIO)
	void init(GPIO_TypeDef* GPIO_STEPMOTOR,		//使用的GPIO，为了节省内存，需要用同一个GPIO
		uint16_t GPIO_Pin_DIR,	//DIR线对应的pin
		uint16_t GPIO_Pin_STEP,		//STEP线对应的pin
		uint16_t GPIO_Pin_ENA			//ENABLE线对应的pin
	);

	//步进电机初始化(需要同一个GPIO)，不使用ENABLE（enable()与disable()将不能使用）
	void init(GPIO_TypeDef* GPIO_STEPMOTOR,		//使用的GPIO，为了节省内存，需要用同一个GPIO
		uint16_t GPIO_Pin_DIR,	//DIR线对应的pin
		uint16_t GPIO_Pin_STEP		//STEP线对应的pin		
	);


	//设置enable为可手工转动
	void enable();

	//设置enable为不可手工转动
	void disable();

	//设置DIR为正向
	void setForward();

	//设置DIR为反向
	void setBackward();

	//Step置1
	void setStepHigh();

	//Step置0
	void setStepLow();

	//正向一步
	void forwardStep(u16 delayMS);

	//正向一步(延时为微秒)
	void forwardStepUs(u16 delayUS);

	//反向一步
	void backwardStep(u16 delayMS);

	//反向一步(延时为微秒)
	void backwardStepUS(u16 delayUS);


private:
	es_Gpio* m_GPIO;
	uint16_t m_Pin_DIR;
	uint16_t m_Pin_STEP;
	uint16_t m_Pin_ENA;
};


#endif
		
